

/**
 * synchronized加锁语法：
 *      // 同步代码块
 *      synchronized (锁对象) {
 *          需要同步执行的代码
 *      }
 *
 *      // 在方法上添加synchronized，则方法是同步代码块，此时锁对象为当前类对象this
 */
public class Count {
    // 定义变量充当锁
    public final static String LOCK = "lock";
    // 定义锁
    public final static Object LOCK2 = new Object();

    public static int count = 0;
    public static int num = 0;
}

class Th1 extends Thread {
    /**
     * 在run方法当中对count变量做操作，同时对num变量做操作
     */
    public void run() {
        for (int i = 0; i < 10000; i++) {
            synchronized (Count.LOCK) {
                // count加一百次
                Count.count++;

                synchronized (Count.LOCK2){
                    // num加一百次
                    Count.num++;
                }
            }
        }
    }
}
// th1  ->  LOCK,LOCK2
// th2  ->  LOCK2,LOCK
class Th2 extends Thread {
    /**
     * 在run方法当中对count变量做操作，同时对num变量做操作
     */
    public void run() {
        for (int i = 0; i < 10000; i++) {
            synchronized (Count.LOCK2) {
                // count加一百次
                Count.count++;

                synchronized (Count.LOCK){
                    // num加一百次
                    Count.num++;
                }
            }
        }
    }
}


class A extends Thread {
    // 同步方法，此时锁为this
    public synchronized void run() {
        for (int i = 0; i < 10000; i++) {
            /*synchronized (Count.LOCK) {  // 获取锁
                // count加一百次
                Count.count++;
            } // 释放锁*/

            // count加一百次
            Count.count++;
        }
    }
}

class B extends Thread {
    public void run() {
        for (int i = 0; i < 10000; i++) {
            synchronized (Count.LOCK) {
                // count减一百次
                Count.count--;
            }
        }
    }
}

class C extends Thread {
    public void run() {
        for (int i = 0; i < 10000; i++) {
            synchronized (Count.LOCK2) {
                // num加一百次
                Count.num++;
            }
        }
    }
}

class D extends Thread {
    public void run() {
        for (int i = 0; i < 10000; i++) {
            synchronized (Count.LOCK2) {
                // num减一百次
                Count.num--;
            }
        }
    }
}
